<script>
   /*
            五、调用

                    1、调用流程

                              ①、确定需求：  明确你想要实现的功能，例如是进行网络请求获取数据，还是调起设备的摄像头拍照等，从而确定需要使用的具体 JS API

                              ②、阅读文档：  在抖音开放平台的官方文档中查找对应API的详细信息，包括 API的名称、功能描述、参数列表、返回值、调用示例以及可能的错误码等。

                              ③、参数准备：  根据API文档的要求，准备好调用API所需的参数。参数的类型、格式和数量必须严格按照文档规定，否则可能导致调用失败。

                              ④、错误处理：  在调用API时，要考虑到可能出现的错误情况，为API的 fail 回调函数编写相应的错误处理逻辑，以便在调用失败时能给用户合适的提示。

                              ⑤、结果处理：  对于API调用成功返回的结果，在 success 回调函数中进行处理，如将数据展示在页面上、进行进一步的计算等。

                              ⑥、完成回调：   无论API调用成功还是失败，  complete 回调函数都会执行，可在其中进行一些通用的收尾操作，如隐藏加载提示等。


                    2、注意事项：

                                  <1>、域名白名单设置：  
                                        
                                          每个小程序使用网络API前需设置域名白名单，且只能与白名单指定域名通信。

                                              ①、域名需满足支持HTTP上协议、非IP地址（局域网IP除外）或 localhost、可配置端口且严格匹配、必须ICP备案等条件。

                                              ②、配置流程： 登录抖音开放凭条---控制台，进入对应小程序详情，选择 【开发】---【开发配置】，点击【域名管理】设置。

                                          详情请参见  "配置域名白名单" https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/api/network/network#%E9%85%8D%E7%BD%AE%E5%9F%9F%E5%90%8D%E7%99%BD%E5%90%8D%E5%8D%95


                                  <2>、超时时间：

                                          网络请求默认超时时间和最大超时时间都是60s，可在 app.json 中通过 networkTimeout 配置修改：

                                              例如：

                                                    // 在JavaScript对象字面量中设置网络超时时间
                                                    const networkTimeout = {
                                                        request: 10000, // 设置request请求超时时间为10秒
                                                        downloadFile: 20000 // 设置downloadFile下载文件超时时间为20秒
                                                    };
                                                    console.log(networkTimeout);


                                  <3>、请求头限制：

                                              网络请求的请求头中的 referer 字段和  user-agent 不可设置。

                                              详情参见： “在网络资源请求添加 referer” 规则： https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/basic-ability/referrer-policy

                                  <4>、小程序后台状态：

                                              小程序进入后台5s后，网络请求接口调用都会无法调用，并回调错误 app in background.



                    3、调用示例

                                以 tt.request 为例，以下是一个完整的代码示例：

                                        
                                      // 封装网络请求函数
                                      function sendRequest(url, method, data) {
                                          return new Promise((resolve, reject) => {
                                              tt.request({
                                                  url: url,
                                                  method: method,
                                                  data: data,
                                                  header: {
                                                      'Content-Type': 'application/json'
                                                  },
                                                  success: function (res) {
                                                      console.log('请求成功', res.data);
                                                      resolve(res.data);
                                                  },
                                                  fail: function (err) {
                                                      console.log('请求失败', err);
                                                      reject(err);
                                                  },
                                                  complete: function () {
                                                      console.log('请求完成');
                                                  }
                                              });
                                          });
                                      }


                                      // 调用封装的网络请求函数
                                      async function fetchData() {
                                          try {
                                              const apiUrl = 'https://your-server.com/api/your-path';  
                                              const requestMethod = 'POST';
                                              const requestData = {
                                                  key1: 'value1',
                                                  key2: 'value2'
                                              };
                                              const result = await sendRequest(apiUrl, requestMethod, requestData);
                                              // 处理返回的数据
                                              console.log('处理返回的数据:', result);
                                          } catch (error) {
                                              // 处理错误
                                              console.log('请求出错:', error);
                                          }
                                      }

                                      // 调用fetchData函数发起请求
                                      fetchData();



                                ★、代码说明：

                                          <1>、封装网络请求函数：sendRequest函数封装了tt.request的调用逻辑，使用Promise来处理异步操作，使得代码更易于管理和复用。
                                            
                                                函数接受三个参数：url（请求的服务器地址）、method（请求方法）和data（请求数据）。


                                          <2>、tt.request调用：在sendRequest函数内部，使用tt.request发起网络请求。设置了请求的url、method、data和请求头header。
                                                
                                                success回调函数在请求成功时将返回的数据通过resolve方法传递出去，fail回调函数在请求失败时将错误信息通过reject方法传递出去。


                                          <3>、调用封装函数：fetchData函数是一个异步函数，使用await关键字调用sendRequest函数，等待请求结果返回。
                                                
                                                如果请求成功，将返回的数据存储在result变量中，并进行进一步的处理；如果请求失败，通过catch块捕获错误并进行处理。


                                          <4>、发起请求：  最后调用 fetchData 函数，发起网络请求。
        */ 
</script>